﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LibPrintTicket;

namespace Punto_de_Venta
{
    public partial class Principal_SPV : Form
    {
        static String[] datosUsuario = Operaciones.GetDatosUsuario();       //obtenemos el arreglo que contiene los datos del usuario activo
        String nombreUsuario = datosUsuario[0];                             //asignamos el nombre de usuario que extraemos del arreglo
        int idUsuario = Convert.ToInt16(datosUsuario[1]);                   //asignamos el id del usuario en la sesion actual
        int nivelUsuario = Convert.ToInt16(datosUsuario[2]);                //asignamos el nivel del usuario actual
        int[] idCategorias = new int[100];                                  // creamos un arreglo que es que almacenara el id de las categorias
        Operaciones operaciones = new Operaciones();                        //creamos un objeto de la clase operaciones que estaremos utilizando en la mayor parte de nuestro software
        DataTable resultadoConsultaSelect;                                  //declaramos el datatable que utilizaremos para las consultas select durante la ejecucion de nuestro programa
        DataRow renglon;                                                    //declaramos el datarow que usaremos para extraer la informacion de un renglon determinado en una consulta select
        DataGridViewRow Seleccionado;
        int idProductoSeleccionado = 0;
        int idEmpleadoSeleccionado = 0;
        int idClienteSeleccionado = 0;
        int idCategoriaSeleccionada = 0;
        int idPedidoSeleccionado = 0;
        double totalPedido = 0;
        double totalPagar = 0;
        //metodo utilizado para inicializar el formulario
        public Principal_SPV()
        {
            InitializeComponent();                                          //inicializamos el formulario y us componentes
        }

        //metodo que se invoca al cargar los componentes de el formulario actual
        private void Principal_SPV_Load(object sender, EventArgs e)
        {
            dgridProductos.DataSource = operaciones.SqlSelect("*", "productos", "");
             if (Operaciones.GetEfectivo() <= 0)
            {
                Operaciones operacion = new Operaciones();
                DataTable tabla = operacion.SqlSelect("*", "corte", "order by id_corte desc");
                if (tabla.Rows.Count > 0 && tabla != null)
                {
                    DataRow renglon = tabla.Rows[0];
                    Double efectivo = Convert.ToDouble(renglon["CantidadFinal"]);
                    Operaciones.SetEfectivo(efectivo);
                    if (efectivo == 0)
                    {
                        EntradaEfectivo();
                    }
                }
                else
                {
                    EntradaEfectivo();
                }
            }

            tmrControl.Enabled = true;
            this.ControlBox = false;            //desactivamos los controles de minimizar, maximizar y cerrar
            ActualizarCategorias();             //invocamos al metodo actualizar categorias
            if (nivelUsuario == 1)              //comprobamos el nivel del usuario activo
            {
                dgridEmpleados.DataSource = operaciones.SqlSelect("id_empleado, nombre, apellidos,telefono, direccion, ciudad", "empleados", "");
                dgridClientes.DataSource = operaciones.SqlSelect("id_cliente, nombre, apellidos,telefono, direccion, ciudad, email, direccion_entrega, cp, usuario", "clientes", "");
                dgridPedidos.DataSource = operaciones.SqlSelect("pedidos.id_pedido, pedidos.fecha_pedido, clientes.nombre", " pedidos ", "INNER JOIN clientes ON pedidos.id_cliente = clientes.id_cliente WHERE (pedidos.estado = 0)");
                btnLeAtiende.Text = nombreUsuario + " - Administrador";     //asignamos el texto que aparecera en el boton indicando el nombre y el nivel del usuario que le esta atendiendo
            }
            else
            {
                tbpEmpleados.Dispose();
                tbpClientes.Dispose();
                tbpPedidos.Dispose();
            btnLeAtiende.Text = nombreUsuario + " - vendedor";          //asignamos el texto que aparecera en el boton indicando el nombre y el nivel del usuario que le esta atendiendo            
            }
            txtCodigoProductoV.Focus();
            cboxPuestoEmpleadoA.SelectedIndex = 0;
            cboxPuestoEmpleadoA.SelectedIndex = 0;
            cboxPuestoEmpleadoM.SelectedIndex = 0;
       }

        //metodo utilizado para salir del formulario actual
        private void btnSalir_Click(object sender, EventArgs e)
        {
            Dispose();      //cerramos el formulario y liberamos todos sus recursos
            Corte corte = new Corte();      //creamos un objeto del formulario login
            corte.Show();                   //mostramos el formulario login
        }

        //metodo utilizado para agregar un producto a nuestra base de datos
        private void btnAgregarProductoA_Click(object sender, EventArgs e)
        {
            if (txtNombreProductoA.Text != "")
            {         //comprobamos que el campo del nombre del producto no este vacia
                try
                {
                    double precio = Convert.ToDouble(txtPrecioProductoA.Text);      //convertimos el campo del precio en double y lo asignamos a la variable precio
                    String codigoProducto = txtCódigoBarrasProductoA.Text;     //declaramos la variable de codigo de producto y alamcenamos el contenido de textbox al que pertenece
                    if (codigoProducto == "")
                    {                                             //si el campo de texto del codigo de barras esta vacio
                        string mensaje = "¿¿Desea dejar el producto sin codigo de barras??";    //le damos el texto que aparecera en el msgbox
                        string titulo = "Error en el formato del codigo de producto";               //titulo del msgbox que utilizaremos      
                        String decision = Operaciones.MessageBoxx(mensaje, titulo);     //mostramos el Operaciones.MessageBoxx y asignamos el resultado al string
                        if (decision == "Yes")
                        {          //comprobamos si el resultado del msgbox es Yes
                            codigoProducto = "";        //asignamos null al codigo del producto
                        }
                        else
                        {
                            throw new ApplicationException("introduzca un codigo de barra del producto valido"); //generamos una excepcion pidiendo que ingrese el codigo de barras del producto para poder continuar
                        }
                    }

                    String nombreTabla = "productos";       //declaramos un string con el nombre de la tabla a la que haremos la consulta
                    String nombre = txtNombreProductoA.Text;        //declaramos el string para almacenar el nombre del producto
                    int idCategoria = idCategorias[cboxCategoríaProductoA.SelectedIndex];       //declaramos el id de categoria y lo obtenemos del indice seleccionado en el combobox
                    string consulta = "insert into " + nombreTabla + "(nombre, id_categoria, precio, codigo) values('"
                                       + nombre + "','" + idCategoria + "','"
                                       + precio + "','" + codigoProducto + "')";           //creamos la cadena que mandaremos a al metodo para insertar en la base datos
                    Boolean resultado = operaciones.Sql(consulta);      //mandamos llamar al metodo de la clase operaciones en el cual se insertarn los datos en la base de datos y obtenemos el resultado boleano
                    if (resultado)
                    {             //si el resultado es true
                        String condicionesConsulta = " order by id_producto desc";    //creamos la consulta para las condiciones de una consulta select
                        resultadoConsultaSelect = operaciones.SqlSelect("id_producto", nombreTabla, condicionesConsulta);                 //mandamos los parametros para que nos regrese una tabla con el resultado de la consulta
                        renglon = resultadoConsultaSelect.Rows[0];                                  //obtenemos el ultimo renglon de la tabla de resultado
                        Operaciones.MessageBoxx("producto insertado correctamente, Id: " + renglon["id_producto"], "Producto Agregado");                              //mostramos el id del producto insertado
                        txtNombreProductoA.Text = null;             //se limpian los campos
                        txtPrecioProductoA.Text = null;
                        txtCódigoBarrasProductoA.Text = null;
                        cboxCategoríaProductoA.SelectedIndex = 0;
                        dgridProductos.DataSource = operaciones.SqlSelect("*", "productos", "");        //actualizamos el datagrid productos

                    }
                    else
                    {       //si no se pudo insertar el producto mostramos un mssgox indicandolo
                        Operaciones.MessageBoxx("no se pudo insetar el producto", "Error Producto");
                    }
                }
                catch (ApplicationException ex)
                {
                    Operaciones.MessageBoxx(ex.Message, ""); //mostramos el mensaje de la excepcion del codigo de barras
                }
                catch (Exception ex)
                {
                    Operaciones.MessageBoxx("Error!!##, corrija el formato del precio", "Formato Invalido"); //Operaciones.MessageBoxx que mostramos pidiendo corregir el formato del precio del producto

                }
            }
            else
            {
                Operaciones.MessageBoxx("Error!!##, especifique un nombre de producto", "Nombre de Producto");  //si no hay nombre de producto pedimos que se especifique uno
            }
        }

        // metodo que utilizaremos para agregar una categoria
        private void btnAgregarCategoríaA_Click(object sender, EventArgs e)
        {
            if (!txtNombreCategoríaA.Text.Equals(""))
            {       //validamos que el cuadro de texto del nombre de categoria no este vacio 
                string consulta = "insert into categorias(nombre) values('"
                                    + txtNombreCategoríaA.Text + "')";        //creamos la consulta que mandaremos a la base de datos
                operaciones.Sql(consulta);      //mandamos llamar el metodoo que nos insertara los datos en la DB
                Operaciones.MessageBoxx("Categoria agregada Satisfactoriamente", "Categoria Agregada");           //mostramos el msgbox indicando que se agrego la categoria
                txtNombreCategoríaA.Text = null;                                    //limpiamos el campo
                ActualizarCategorias();                                                //actualizamos las categorias
            }
            else
            {
                Operaciones.MessageBoxx("No se pudo agregar categoria, Especifique un nombre", "No se Agrego categoria");        //mostramos el msgbox indicando que no fue posible agregar la caegoria ya que no se especifico un nombre
            }
        }

        //metodo que utilizaremos para las categorias de los productos
        public void ActualizarCategorias()
        {
            cboxCategoríaProductoA.Items.Clear();       //limpiamos los combobox
            cboxCategoríaProductoM.Items.Clear();
            resultadoConsultaSelect = operaciones.SqlSelect("*", "categorias", "");     //realizamos la consulta de las categorias a la base de datos
            dgridCategorias.DataSource = resultadoConsultaSelect;
            for (int i = 0; i < resultadoConsultaSelect.Rows.Count; i++)        //ciclo que nos ayudara a llenar la informacion del arreglo y los combobox
            {
                renglon = resultadoConsultaSelect.Rows[i];      //obtenemos el renglon de la consulta         
                idCategorias[i] = Convert.ToInt16(renglon["id_categoria"]);     //insertamos el id de la categoria en el indice correspondiente
                cboxCategoríaProductoA.Items.Add(Convert.ToString(renglon["nombre"]));      //llenamos los combobox con los nombres de las categorias
                cboxCategoríaProductoM.Items.Add(Convert.ToString(renglon["nombre"]));

            }
            cboxCategoríaProductoA.SelectedIndex = 0;       //indicamos el indice que aparecera seleccionado por default en los combobox
            cboxCategoríaProductoM.SelectedIndex = 0;
        }

        //metodo que busca dentro de los id de categorias y retorna el indice en el que se encuentra la categoria buscada
        public int BuscarCategoria(int idCategoria)
        {
            for (int i = 0; i < idCategorias.Length; i++)
            {
                if (idCategorias[i] == idCategoria)
                {
                    return i;
                }
            }
            return -1;
        }

        //metodo mediante el cual el usuario seleccionara el producto que desea eliminar


        //metodo mediante el cual el usuario eliminara un producto antes seleccionado
        private void btnEliminarProductoE_Click(object sender, EventArgs e)
        {
            if (idProductoSeleccionado > 0)         //comprobacion de id de producto seleccionado mayor de 0
            {
                String respuesta = Operaciones.MessageBoxx("¿esta seguro de eliminar el producto seleccionado?. Id:" + idProductoSeleccionado, "Confirmacion de Eliminacion");  //se cuestiona si en realidad se desea eliminar el producto
                if (respuesta == "Yes")         //si la respuesta es Yes se procede con la eliminacion del producto
                {
                    String consulta = "delete from productos where id_producto='" + idProductoSeleccionado + "'";       //se genera la consulta
                    Boolean resultado = operaciones.Sql(consulta);          //se ejecuta la consulta
                    idProductoSeleccionado = 0;                               //asignamos 0 al id de producto seleccionado
                    dgridProductos.DataSource = operaciones.SqlSelect("*", "productos", "");        //actualizamos tabla de productos
                    if (resultado)                  //si al ejecutar la consulta nos regresa true, mostramos un messagebox donde se avisa que el producto fue eliminado
                    {

                        Operaciones.MessageBoxx("Producto eliminado correctamente", "Confirmacion de Producto Eliminado");
                    }
                    else
                    {
                        Operaciones.MessageBoxx("No se pudo eliminar el producto, intentelo nuevamente", "Confirmacion de Producto Eliminado");     //si no se puede eliminar el producto se nuestra el mensaje que lo indica
                    }
                }

            }
            else
            {
                Operaciones.MessageBoxx("Primero seleccione un producto", "confirmacion de producto");      //si no ah seleccionado un prodcuto se muestra el mensaje indicando que primero debe seleccionar producto
            }
        }

        //selecciona el producto a modificar
        private void btnSeleccionarProductoM_Click(object sender, EventArgs e)
        {
            string nombreTabla = "productos";      //dclaracion del nombre de la tabla que se utilizara en la consulta
            string condiciones = " where id_producto='" + idProductoSeleccionado + "'";  //condiciones necesarias para la consulta
            if (idProductoSeleccionado > 0)
            {
                resultadoConsultaSelect = operaciones.SqlSelect("*", nombreTabla, condiciones);          //se procesa la informacion y se obtiene un resultado de la base de datos
                if (resultadoConsultaSelect.Rows.Count > 0)         //si el resultado contiene renglones
                {
                    renglon = resultadoConsultaSelect.Rows[0];      //se obtiene el registro con el datarow
                    txtNombreProductoM.Text = renglon["nombre"].ToString();     //se extraen los datos obtenidos de la consulta y se asigna a los controles del form
                    txtPrecioProductoM.Text = renglon["precio"].ToString();
                    txtIdProductoM.Text = renglon["id_producto"].ToString();
                    txtCodigoBarrasProductoM.Text = renglon["codigo"].ToString();
                    cboxCategoríaProductoM.SelectedIndex = BuscarCategoria(Convert.ToInt16(renglon["id_categoria"]));       //se obtiene la categoria correspondiente a la consulta
                    pnlModificarProducto.Visible = true;        //se muestran los controles que se necesitan y se ocultan lo que no se requiren
                    btnModificarProductoM.Visible = true;
                    pnlProductos.Visible = false;
                    btnSeleccionarProductoM.Visible = false;
                    btnEliminarProductoE.Visible = false;
                    Operaciones.MessageBoxx("modifique la informacion del producto" + Environment.NewLine + " y despues haga click en Guardar Cambios", "informacion");         //se muestra un mensaje de indicacion
                }
                else
                {
                    Operaciones.MessageBoxx("El producto que esta intentando" + Environment.NewLine + " seleccionar no existe, intente nuevamente", "Producto Inexistente");       //mensaje que indica que el producto no existe en la base de datos

                }
            }
            else
            {
                Operaciones.MessageBoxx("Error!!###, Primero seleccione un " + Environment.NewLine + " en la tabla", "");        //mensaje que indica que primero debemos seleccionar un producto
            }
        }

        //metodo mediante el cual el usuario podra modificar un producto
        private void btnModificarProductoM_Click(object sender, EventArgs e)
        {
            if (txtNombreProductoM.Text != "")
            {         //comprobamos que el campo del nombre del producto no este vacia
                try
                {
                    double precio = Convert.ToDouble(txtPrecioProductoM.Text);      //convertimos el campo del precio en double y lo asignamos a la variable precio
                    String codigoProducto = txtCodigoBarrasProductoM.Text;     //almacenamos el valor del txt que representa al codigo de barras y lo guardamos en la variable del codigo
                    if (codigoProducto == "")
                    {                                             //si se produce un error al hacer la conversion anterior mostraremos un msgbox para preguntar si el producto no contendra codigo de barras
                        string mensaje = "¿¿Desea dejar el producto sin codigo de barras??";    //le damos el texto que aparecera en el msgbox
                        string titulo = "Error en el formato del codigo de producto";               //titulo del msgbox que utilizaremos      
                        String decision = Operaciones.MessageBoxx(mensaje, titulo);     //mostramos el Operaciones.MessageBoxx y asignamos el resultado al string
                        if (decision == "Yes")
                        {          //comprobamos si el resultado del msgbox es Yes
                        }
                        else
                        {
                            throw new ApplicationException("introduzca un codigo de barra del producto valido"); //generamos una excepcion pidiendo que ingrese el codigo de barras del producto para poder continuar
                        }
                    }

                    String nombreTabla = "productos";       //declaramos un string con el nombre de la tabla a la que haremos la consulta
                    String nombre = txtNombreProductoM.Text;        //declaramos el string para almacenar el nombre del producto
                    int idCategoria = idCategorias[cboxCategoríaProductoM.SelectedIndex];       //declaramos el id de categoria y lo obtenemos del indice seleccionado en el combobox
                    string consulta = "update " + nombreTabla + " set nombre='" + nombre
                                       + "', id_categoria='" + idCategoria
                                       + "', precio='" + precio
                                       + "', codigo='" + codigoProducto
                                       + "' where id_producto='" + txtIdProductoM.Text + "'";           //creamos la cadena que mandaremos a al metodo para actualizar la informacion de un producto en la base datos
                    Boolean resultado = operaciones.Sql(consulta);      //mandamos llamar al metodo de la clase operaciones en el cual se modificara los datos en la base de datos y obtenemos el resultado boleano
                    if (resultado)
                    {             //si el resultado es true
                        Operaciones.MessageBoxx("producto Actualizado correctamente, Id: " + txtIdProductoM.Text, "Producto Actualizado");                              //mostramos el id del producto Modificado
                        txtIdProductoM.Text = "";
                        dgridProductos.DataSource = operaciones.SqlSelect("*", "productos", "");
                        pnlModificarProducto.Visible = false;
                        pnlProductos.Visible = true;
                        btnSeleccionarProductoM.Visible = true;
                        btnEliminarProductoE.Visible = true;

                    }
                    else
                    {       //si no se pudo insertar el producto mostramos un mssgox indicandolo
                        Operaciones.MessageBoxx("no se pudo Modificar la informacion de producto", "Modificacion de Producto");
                    }
                }
                catch (ApplicationException ex)
                {
                    Operaciones.MessageBoxx(ex.Message, ""); //mostramos el mensaje de la excepcion del codigo de barras
                }
                catch (Exception ex)
                {
                    Operaciones.MessageBoxx("Error!!##, corrija el formato del precio", "Formato Invalido"); //Operaciones.MessageBoxx que mostramos pidiendo corregir el formato del precio del producto

                }
            }
            else
            {
                Operaciones.MessageBoxx("Error!!##, especifique un nombre de producto", "Nombre de Producto");  //si no hay nombre de producto pedimos que se especifique uno
            }
        }

        //agregar producto a la lista de venta al dar click en el boton
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            AgregarProductoVenta();         //llamamos al metodo de agregar producto a la lista de venta
        }

        //metodo mediante el cual el usuario selecciona un elemento del producto que desea eliminar de la lista
        private void dgridPrincipal_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)          //si el usuario dio click izquierdo sobre el data grid
            {
                if (dgridPrincipal.RowCount > 0)        //si el datagrid contiene renglones
                {
                    DataGridView.HitTestInfo hit = dgridPrincipal.HitTest(e.X, e.Y);  //se toman los indices de la celda en la cual el usuario dio click
                    if (hit.Type == DataGridViewHitTestType.Cell)
                    {
                        Seleccionado = dgridPrincipal.Rows[hit.RowIndex];       //se asigna el seleccionado

                    }
                }
            }
        }

        //metodo utilizado para cancelar un producto de la lista de venta
        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgridPrincipal.RowCount > 0)            //si el datagrid contiene renglones
                {
                    dgridPrincipal.Rows.RemoveAt(Seleccionado.Index);       //se elimina el renglon previamente seleccionado
                }
                else
                {
                    Operaciones.MessageBoxx("Error!!... Lista vacia", "Error");      //mensaje que indica que la lista esta vacia
                }
            }
            catch
            {
                Operaciones.MessageBoxx("Primero de click en el elemento"+Environment.NewLine+" que desea eliminar", "Seleccione elemento");        //mensaje que indica que aun no hemos seleccionado el prodcto que deseamos borrar
            }
            txtCodigoProductoV.Focus();     //le damos el foco al txt para seguir insertando productos en la lista
        }

        //timer que sirve para actualizar alguna informacion
        private void tmrControl_Tick(object sender, EventArgs e)
        {
            lblDineroDisponbleCaja.Text = String.Format("{0:C}", Operaciones.GetEfectivo()); //obtenemos el efectivo disponible en caja
            totalPagar = 0;
            if (dgridPrincipal.RowCount > 0)       // si el datagrid cuenta con productos procederemos a hacer la suma para calcular el total que un cliente debera pagar
            {

                for (int i = 0; i < dgridPrincipal.RowCount; i++)       //recorremos el datagrid
                {
                    totalPagar += Convert.ToDouble(dgridPrincipal[4, i].Value);  //obtenemos la suma del total a pagar
                }

            }
            lblTotalPagarV.Text = String.Format("{0:C}", totalPagar);       // mostramos el total a pagar y le damos formato de moneda

            lblFechaHora.Text = DateTime.Now.ToString();            //obtenemos la fecha del sistema y la mostramos en un label

        }

        //metodo utilizado para realizar el cobro de una venta y registrar en la base de datos.
        private void btnCobrar_Click(object sender, EventArgs e)
        {

            if (totalPagar > 0)         //el total que el cliente debera pagar debe ser mayor que 0
            {
                double efectivoPagado = -1;         //declaramos la variable que almacenara el efectivo que el cliente entregara
                while (efectivoPagado < totalPagar)     //mientras el efectivo que el cliente esta pagando sea menor que el total a pagar
                {
                    if (efectivoPagado != -1)
                    {  //esto nos ayudara para que en el primer ciclo no se muestre el mensaje
                        Operaciones.MessageBoxx("el pago no puede ser menor que el total", "pago insuficiente");  //se mostrara mensaje indicando que el efectivo obtenido es menos que el total a pagar
                    }
                    try
                    {
                        efectivoPagado = Convert.ToDouble(InputBox("ingrese el efectivo con el que se esta realizando el pago", "efectivo en el pago"));        //convertimos a double el valor obtenido del inputbox
                    }
                    catch
                    {
                        Operaciones.MessageBoxx("cantidad invalida, intentelo de nuevo", "formato de efectivo invalido");       //si se introdujo un valor invalido, se muestra este mensaje indicandolo
                    }
                }
                Operaciones.MessageBoxx("Su Cambio es: " + (efectivoPagado - totalPagar), "Cambio");        //mostramos la cantidad que el cliente debe recibir como cambio
                String fechaVenta = DateTime.Now.ToString("yyyy-MM-dd");        //obtenemos la fecha de la venta
                String horaVenta = DateTime.Now.ToString("HH:mm:ss");           //obtenemos lahora
                string consulta = "insert into ventas(fecha, hora, id_cliente, id_empleado)values('" + fechaVenta + "','" + horaVenta + "','1','" + idUsuario + "')";       //insertamos en la base de datos

                if (operaciones.Sql(consulta))      //si se inserta correctamente en la base de datos
                {
                    renglon = operaciones.SqlSelect("id_venta", "ventas", " where fecha='" + fechaVenta + "' and hora='" + horaVenta + "'").Rows[0];          //obtenemos el id registrado en la base de datos de la venta que estamos realizandor
                    for (int i = 0; i < dgridPrincipal.Rows.Count; i++)         //recorremos el datagrid
                    {
                        consulta = "insert into detalle_venta(id_producto, cantidad, id_venta) values('" + dgridPrincipal[0, i].Value.ToString() + "','" + dgridPrincipal[2, i].Value.ToString() + "','" + renglon["id_venta"].ToString() + "')";       //insertamos los detalles de venta
                        operaciones.Sql(consulta);      //inserttamos los detalles en la base de datos
                    }
                    ImprimeTicket(efectivoPagado,1);      //  mandamos imprimir el ticket de venta
                    Operaciones.MessageBoxx("Venta Realizada Con Exito!!", "Venta Realizada");
                    Operaciones.SumarEfectivo(Convert.ToDouble(totalPagar));       //sumamos el efectivo disponible en la caja
                    dgridPrincipal.Rows.Clear();            //limpiamos el datagrid de la venta
                    lblTotalPagarV.Text = String.Format("{0:C}", "0");          //reseteamos el campo de total a pagar
                }
            }
            else
            {
                Operaciones.MessageBoxx("primero debe seleccionar los productos", "Seleccion de Producto");      //mensaje que indica que no hay productos
            }
            txtCodigoProductoV.Focus();        //damos el foco al cuadro de texto para agregar productos
        }

        //agrega los productos a la lista de la venta mediante la tecla enter
        private void txtCodigoProductoV_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Return))
            {
                AgregarProductoVenta();     //llamamos al metodo para agregar productos a la venta
            }
        }

        //agrega un producto a la lista de venta
        public void AgregarProductoVenta()
        {
            try
            {
                string idProducto = txtCodigoProductoV.Text;        //obtenemos el valor del campo y lo almacenamos en una variable string
              
                if (!idProducto.Equals("0") && !idProducto.Contains(" ") && !idProducto.Equals("") )
                {
                    Boolean productoRepetido = false;       //declaramos una variable boleana que utilizarmos para saber si el producto ya existe dentro de la lista
                    if (dgridPrincipal.RowCount > 0)    //si hay  datos en el datagrid 
                    {
                        for (int i = 0; i < dgridPrincipal.RowCount; i++)       //recorreremos el datagrid
                        {
                            renglon = operaciones.SqlSelect("*", "productos", " where id_producto='" + dgridPrincipal[0, i].Value.ToString() + "'").Rows[0];      //consultamos en la base de datos
                            String codigo = renglon["codigo"].ToString();       //obtenemos el codigo del producto

                            if (txtCodigoProductoV.Text == dgridPrincipal[0, i].Value.ToString() || txtCodigoProductoV.Text == codigo)      //comparamos si ya existe el producto en la lista
                            {
                                int cantidad = Convert.ToInt16(dgridPrincipal[2, i].Value) + 1;         //aumentamos es un la cantidad y cambiamos los valores dentro del datagrid
                                dgridPrincipal[2, i].Value = cantidad;
                                dgridPrincipal[4, i].Value = cantidad * Convert.ToDouble(dgridPrincipal[3, i].Value);
                                productoRepetido = true;        //asignamos true al producto repetido
                            }

                        }
                    }
                    if (!productoRepetido)      //si no hay producto repetidoo procedemos a insertar producto nuevo
                    {
                        string nombreTabla = "productos";       //parametros de la consulta que se realizara a la base de datos
                        string condiciones = " where id_producto='" + idProducto + "' or codigo='" + idProducto + "'";
                        resultadoConsultaSelect = operaciones.SqlSelect("*", nombreTabla, condiciones);     //realizamos la consulta
                        if (resultadoConsultaSelect.Rows.Count > 0)     //si se obtienen resultados
                        {
                            renglon = resultadoConsultaSelect.Rows[0];      //obtenemos el primer renglon de la consulta y extraemos la informacion que necesitamso
                            idProducto = renglon["id_producto"].ToString();
                            string nombre = renglon["nombre"].ToString();
                            int cantidad = 1;
                            double precio = Convert.ToDouble(renglon["precio"]);
                            double neto = cantidad * precio;
                            dgridPrincipal.Rows.Add(idProducto, nombre, cantidad, precio, neto); //añade al final de la lista
                        }
                        else
                        {
                            Operaciones.MessageBoxx("no existe el producto con id o codigo: " + idProducto, "no existe producto");  //indicamos que no existe el producto en la base de datos
                        }
                    }
                }
                else
                {
                    Operaciones.MessageBoxx("el id o codigo del producto no puede ser 0" + Environment.NewLine + " ni estar vacio", "Codigo Invalido");     //indicamos que el valor del cuadro de texto es invalido
                }
            }
            catch
            {
                Operaciones.MessageBoxx("Error!!##, introduzca un codigo o id de producto valido", "Id invalido");       //indicamos que el valor introducido no es valido
            }
            txtCodigoProductoV.Text = null;     //reseteamos el valor del campo de texto
            txtCodigoProductoV.Focus();      //damos el foco al campo de texto
        }

        //agrega un empleado a la Base de datos
        private void btnAgregarEmpleadoA_Click(object sender, EventArgs e)
        {
            try
            {
                if (!txtCiudadEmpleadoA.Text.Equals("") && !txtNombreEmpleadoA.Text.Equals("")      //validaciones de campos vacios
                    && !txtApellidoEmpleadoA.Text.Equals("")
                    && !txtTelefonoEmpleadoA.Text.Equals("")
                    && !txtDireccionEmpleadoA.Text.Equals("")
                    && !txtContraseñaEmpleadoA.Text.Equals(""))
                {
                    long telefono = 0;
                    if (txtContraseñaEmpleadoA.Text.Equals(txtRepiteContraseñaEmpleadoA.Text))      //validacion de contraseñas iguales
                    {
                        try
                        {
                            if (txtTelefonoEmpleadoA.TextLength < 10)       //si el telefono es demasiado corto
                            {
                                throw new ApplicationException("Ingrese un numero Telefonico Valido (10 DIGITOS COMO MINIMO)"); //generamos una excepcion pidiendo que ingrese el codigo de barras del producto para poder continuar
                            }
                            telefono = Convert.ToInt64(txtTelefonoEmpleadoA.Text);  //tomamos el numero de telefono y lo almacenamos en la variable
                        }
                        catch
                        {
                            string ValidaTelefono = Operaciones.MessageBoxx("Numero Telefonico invalido, desea correjir" + Environment.NewLine + " el numero de telefono antes de Agregar el empleado?", "Numero Telefonico invalido");        //preguntamos si desea correjir el numero telefonico
                            if (ValidaTelefono == "Yes")    //si el resultado es si
                            {
                                txtTelefonoEmpleadoA.Text = "";
                                throw new ApplicationException("Ingrese un numero Telefonico Valido (SOLO NUMEROS)"); //generamos una excepcion pidiendo que ingrese el codigo de barras del producto para poder continuar
                            }
                        }
                        String nombreTabla = "empleados";
                        string consulta = "insert into " + nombreTabla          //generamos la consulta
                                         + "(nombre, apellidos,nivel,telefono,direccion,ciudad, password)values('"
                                         + txtNombreEmpleadoA.Text + "','"
                                         + txtApellidoEmpleadoA.Text + "','"
                                         + (cboxPuestoEmpleadoA.SelectedIndex + 1) + "','"
                                         + telefono + "','"
                                         + txtDireccionEmpleadoA.Text + "','"
                                         + txtCiudadEmpleadoA.Text + "','"
                                         + txtContraseñaEmpleadoA.Text + "')";
                        if (operaciones.Sql(consulta))      //ejecutamos la consulta
                        {
                            String condicionesConsulta = " order by id_empleado desc ";    //creamos la consulta para las condiciones de una consulta select
                            resultadoConsultaSelect = operaciones.SqlSelect("id_empleado", nombreTabla, condicionesConsulta);                 //mandamos los parametros para que nos regrese una tabla con el resultado de la consulta
                            renglon = resultadoConsultaSelect.Rows[0];                                  //obtenemos el ultimo renglon de la tabla de resultado
                            Operaciones.MessageBoxx("Empleado Agregado correctamente, Id: " + renglon["id_empleado"], "Empleado Agregado");                              //mostramos el id del producto insertado
                            txtNombreEmpleadoA.Text = null;     //limpiamos los campos
                            txtApellidoEmpleadoA.Text = null;
                            txtTelefonoEmpleadoA.Text = null;
                            txtDireccionEmpleadoA.Text = null;
                            txtCiudadEmpleadoA.Text = null;
                            txtContraseñaEmpleadoA.Text = null;
                            txtRepiteContraseñaEmpleadoA.Text = null;
                            dgridEmpleados.DataSource = operaciones.SqlSelect("id_empleado, nombre, apellidos,telefono, direccion, ciudad", "empleados", "");
                        }
                        else
                        {
                            Operaciones.MessageBoxx("Error al intentar agregar Empleado", "No Se Agrego Empleado");     //mensaje que informa que no se agrego empleado
                        }
                    }
                    else
                    {
                        Operaciones.MessageBoxx("las contraseñas deben ser iguales", "Contraseñas no coinciden");       // mensaje indicando que las contraseñas no coinciden
                    }
                }
                else
                {
                    Operaciones.MessageBoxx("Rellene Todos Los Datos del Empleado"+Environment.NewLine+" No Se Permiten Campos Vacios", "Campos Vacios");     //indica que existen campos vacios y pide rellenarlos
                }
            }
            catch (ApplicationException ex)
            {
                Operaciones.MessageBoxx(ex.Message, "");     //excepcion del numero telefonico
            }
        }

        //metodo utilizado para imprimir ticket, recibe el efectivo que el cliente pago
        public void ImprimeTicket(double efectivoRecibido, int tipo)
        {
            try
            {
                Ticket ticket = new Ticket();       //se declara el objeto de ticket
                ticket.AddHeaderLine("El Gran Mercado");        //se imprime la informacion en el encabezado
                ticket.AddHeaderLine("EXPEDIDO EN:");
                ticket.AddHeaderLine("CALLE CONOCIDA");
                ticket.AddHeaderLine("MOCTEZUMA, MOCTEZUMA");
                ticket.AddHeaderLine("RFC: CSI-020226-MV4");

                int numeroTicket=0;
                if (tipo == 1)
                {
                    renglon = operaciones.SqlSelect("id_venta", "ventas", "order by id_venta desc").Rows[0];        //se obtiene la ultima venta realizada
                    numeroTicket = Convert.ToInt16(renglon["id_venta"]);  //se pone el numero de ticket como el id de la venta
                    ticket.AddSubHeaderLine("Ticket de venta #" + numeroTicket.ToString());     //se imprime el numero de ticket y la fecha y hora       
                    ticket.AddSubHeaderLine(DateTime.Now.ToString());
                for (int i = 0; i < dgridPrincipal.RowCount; i++)       //se recorre la lista de venta
                {
                    ticket.AddItem(dgridPrincipal[2, i].Value.ToString()        //agregamos el listado de productos en el ticket
                                    , dgridPrincipal[1, i].Value.ToString()
                                    , String.Format("{0:C}", dgridPrincipal[4, i].Value));
                }
                ticket.AddTotal("TOTAL", string.Format("{0:C}", totalPagar));        //imprimimos el total a pagar
                ticket.AddTotal("", "");        //añadimos linea en blanco
                ticket.AddTotal("Pago Con", string.Format("{0:C}", efectivoRecibido));       //imprimimos el efectivo recibido
                ticket.AddTotal("Su Cambio es:", string.Format("{0:C}", (efectivoRecibido - totalPagar)));       //imprimimos el cambio
                ticket.AddTotal("", "");
                }
                else {
                    renglon = operaciones.SqlSelect("id_pedido", "pedidos", "order by id_pedido desc").Rows[0];        //se obtiene la ultima venta realizada
                    numeroTicket = Convert.ToInt16(renglon["id_pedido"]);  //se pone el numero de ticket como el id de la venta
                    ticket.AddSubHeaderLine("Ticket de pedido web #" + numeroTicket.ToString());     //se imprime el numero de ticket y la fecha y hora       
                    ticket.AddSubHeaderLine(DateTime.Now.ToString());
                  
                    for (int i = 0; i < dgridDetallePedido.RowCount; i++)       //se recorre la lista de venta
                    {
                        ticket.AddItem(dgridDetallePedido[2, i].Value.ToString()        //agregamos el listado de productos en el ticket
                                        , dgridDetallePedido[0, i].Value.ToString()
                                        , String.Format("{0:C}", dgridDetallePedido[3, i].Value));
                        
                    }
                    ticket.AddTotal("TOTAL", string.Format("{0:C}", totalPedido));        //imprimimos el total a pagar
                    ticket.AddTotal("", "");        //añadimos linea en blanco
                   
                
                }
                ticket.AddFooterLine("Le Atendio: " + nombreUsuario);       //y por ultimo el pie del ticket
                ticket.AddFooterLine("");
                ticket.AddFooterLine("Gracias por su Compra!!!...");
                ticket.AddFooterLine("VUELVA PRONTO");
                ticket.PrintTicket("CutePDF Writer"); //Nombre de la impresora de tickets
            }
            catch
            {
                Operaciones.MessageBoxx("Error##, no se pudo imprimir el ticket", "Error impresion de ticket");     //mensaje que indica que no se pudo imprimir el ticket
            }
        }

        //metodo que elimina un empleado 
        private void btnEliminarEmpleadoE_Click(object sender, EventArgs e)
        {
            if (idEmpleadoSeleccionado != 0)            //si tenemos un empleado seleccionado
            {
                String respuesta = Operaciones.MessageBoxx("Si desea eliminar el empleado seleccionado"
                                                            + Environment.NewLine + "Id:"
                                                            + idEmpleadoSeleccionado + " Pulse Aceptar", "verifuque la informacion");       //messagebox de autorizacion de eliminacion
                if (respuesta == "Yes")           //si se responde que si
                {
                    String consulta = "delete from empleados where id_empleado='" + idEmpleadoSeleccionado + "'";       //se crea la conuslta
                    if (operaciones.Sql(consulta))
                    {
                        Operaciones.MessageBoxx("Empleado eliminado ", "confirmacion de empleado eliminado");                       //se ejecuta la consulta y se actualiza el datagrid
                        dgridEmpleados.DataSource = operaciones.SqlSelect("id_empleado, nombre, apellidos,telefono, direccion, ciudad", "empleados", "");

                    }
                    else
                    {
                        Operaciones.MessageBoxx("no se pudo eliminar la informacion del empleado", "confirmacion de empleado eliminado");           //mensaje que indica qque no se elimino el empleado
                    }
                }
            }
            else
            {
                Operaciones.MessageBoxx("primero seleccione un empleado de la tabla", "Selecione Empleado");            //mensaje que indica que aun no se ah seleccionado ningun empleado
            }
        }

        //seleciona el producto a modificar
        private void btnSeleccionarEmpleadoM_Click(object sender, EventArgs e)
        {
            if (idEmpleadoSeleccionado > 0)             //si tenemos empleado seleccionado
            {
                string nombreTabla = "empleados";               //declaramos el nombre de la tabla y la restriccion de la consulta
                string condiciones = " where id_empleado='" + idEmpleadoSeleccionado + "'";
                resultadoConsultaSelect = operaciones.SqlSelect("*", nombreTabla, condiciones);     //ejecutamos la consulta
                if (resultadoConsultaSelect.Rows.Count > 0)
                {
                    renglon = resultadoConsultaSelect.Rows[0];                      //se extraen los datos obtenidos en la consulta 
                    txtIdEmpleadoM.Text = renglon["id_empleado"].ToString();
                    txtNombreEmpleadoM.Text = renglon["nombre"].ToString();
                    txtApellidoEmpleadoM.Text = renglon["apellidos"].ToString();
                    txtTelefonoEmpleadoM.Text = renglon["telefono"].ToString();
                    txtDireccionEmpleadoM.Text = renglon["direccion"].ToString();
                    cboxPuestoEmpleadoM.SelectedIndex = Convert.ToInt16(renglon["nivel"]) - 1;
                    txtCiudadEmpleadoM.Text = renglon["ciudad"].ToString();
                    txtContraseñaEmpleadoM.Text = renglon["password"].ToString();
                    txtRepiteContraseñaEmpleadoM.Text = renglon["password"].ToString();
                    pnlModificarEmpleadoM.Visible = true;
                    pnlVerEmpleados.Visible = false;
                    btnSeleccionarEmpleadoM.Visible = false;
                    btnEliminarEmpleadoE.Visible = false;
                }
                else
                {
                    Operaciones.MessageBoxx("el empleado que esta intentando buscar no existe", "Empleado Inexistente");        //mensaje que indica que el empleado no existe
                }
            }
            else
            {
                Operaciones.MessageBoxx("Error##... primero" + Environment.NewLine + " debe seleccionar un empleado de la lista", "Seleccione primero");        //mensaje que indica que un no se ah seleccionado empleado
            }
        }

        //modifica la informacion de un empleado
        private void btnModificarEmpleadoM_Click(object sender, EventArgs e)
        {
            try
            {
                if (!txtCiudadEmpleadoM.Text.Equals("") && !txtNombreEmpleadoM.Text.Equals("")          //validacion de campos vacios
                    && !txtApellidoEmpleadoM.Text.Equals("")
                    && !txtTelefonoEmpleadoM.Text.Equals("")
                    && !txtDireccionEmpleadoM.Text.Equals("")
                    && !txtContraseñaEmpleadoM.Text.Equals(""))
                {
                    long telefono = 0;
                    if (txtContraseñaEmpleadoM.Text.Equals(txtRepiteContraseñaEmpleadoM.Text))          //validacion de contraseñas iguales
                    {
                        try
                        {
                            if (txtTelefonoEmpleadoM.TextLength < 10)                               //validacion de telefono
                            {
                                throw new ApplicationException("Ingrese un numero Telefonico Valido (10 DIGITOS COMO MINIMO)"); //generamos una excepcion pidiendo que ingrese el codigo de barras del producto para poder continuar
                            }
                            telefono = Convert.ToInt64(txtTelefonoEmpleadoM.Text);              //almacenamos el numero telefonico en un variable double
                        }
                        catch
                        {
                            string ValidaTelefono = Operaciones.MessageBoxx("Numero Telefonico invalido, desea correjir el numero de telefono antes de Agregar el empleado?"
                                                                 , "Numero Telefonico invalido");                   //mensaje que indica que el telefono ingresado no es valido
                            if (ValidaTelefono == "Yes")
                            {
                                txtTelefonoEmpleadoM.Text = "";
                                throw new ApplicationException("Ingrese un numero Telefonico Valido (SOLO NUMEROS)"); //generamos una excepcion pidiendo que ingrese el codigo de barras del producto para poder continuar
                            }
                        }
                        String nombreTabla = "empleados";               //creamos la consulta que ingresaremos
                        string consulta = "update " + nombreTabla
                                         + " set nombre='" + txtNombreEmpleadoM.Text
                                         + "', apellidos='" + txtApellidoEmpleadoM.Text
                                         + "',nivel='" + (cboxPuestoEmpleadoM.SelectedIndex + 1)
                                         + "',telefono='" + telefono
                                         + "',direccion='" + txtDireccionEmpleadoM.Text
                                         + "',ciudad='" + txtCiudadEmpleadoM.Text
                                         + "', password='" + txtContraseñaEmpleadoM.Text
                                         + "' where id_empleado='" + txtIdEmpleadoM.Text + "'";
                        if (operaciones.Sql(consulta))          //se ejecuta la consulta y si nos da un valor true
                        {
                            Operaciones.MessageBoxx("Empleado Modificado Correctamente", "Modificacion Empleado");          //mostramos el mensaje indicando que se modifico la informacion y actualizamos el datagrid de empleados                            //mostramos el id del producto insertado
                            idEmpleadoSeleccionado = 0;                             //restablecemos los valores
                            pnlModificarEmpleadoM.Visible = false;
                            pnlVerEmpleados.Visible = true;
                            btnEliminarEmpleadoE.Visible = true;
                            btnSeleccionarEmpleadoM.Visible = true;
                            dgridEmpleados.DataSource = operaciones.SqlSelect("id_empleado, nombre, apellidos,telefono, direccion, ciudad", "empleados", "");
                        }
                        else
                        {
                            Operaciones.MessageBoxx("Error al intentar Modificar Empleado", "No Se Modifico Empleado");         //mensaje que indica que no se modifico informacion de empleado
                        }

                    }
                    else
                    {
                        Operaciones.MessageBoxx("las contraseñas deben ser iguales", "Contraseñas no coinciden");           //mensaje que indica que las contraseñas nos son iguales
                    }
                }
                else
                {
                    Operaciones.MessageBoxx("Rellene Todos Los Datos del Empleado, No Se Permiten Campos Vacios", "Campos Vacios");     //mensaje que indica que existen campos vacios
                }
            }
            catch (ApplicationException ex)
            {
                Operaciones.MessageBoxx(ex.Message, "");            //mensaje que indica que se debe introducir un numero telefonico valido
            }
        }



        //eliminar categoria
        private void btnEliminarCategoríaE_Click(object sender, EventArgs e)
        {
            if (idCategoriaSeleccionada > 0)            //si tenemos una categoria seleccionada
            {
                if (Operaciones.MessageBoxx("al elminimar una categoria se eliminaran todos " + Environment.NewLine + "sus productos ¿desea elminar la categoria?", "desea Eliminar Categoria") == "Yes")       //mostramos messagebox y pedimos confirmacion
                {
                    String consulta = "delete from categorias where id_categoria='" + idCategoriaSeleccionada + "'";            //creamos la consulta
                    if (operaciones.Sql(consulta))          //se ejecuta la consulta y si nos regresa un valor verdadero
                    {
                        ActualizarCategorias();             //actualizamos las categorias y mostramos el mensaje indicando que se elimino la categoria
                        idCategoriaSeleccionada = 0;
                        Operaciones.MessageBoxx("Categoria Eliminada ", "confirmacion de Categoria Eliminada");
                    }
                    else
                    {
                        Operaciones.MessageBoxx("no se pudo eliminar la Categoria", "confirmacion de Categoria Eliminada");     //si ocurre algun error mostramos mensaje indicando qeu no se pudo eliminar categoria
                    }
                }
            }
            else
            {
                Operaciones.MessageBoxx("Primero debe seleccionar la categoria", "seleccione Categoria");           //mensaje que indica que no hay categoria seleccionada
            }
        }

        //seleccionar categoria a modificar
        private void btnSeleccionarCategoríaM_Click(object sender, EventArgs e)
        {
            if (idCategoriaSeleccionada > 0)            //si hay una categoria seleccionada
            {
                string nombreTabla = "categorias";              //declaramos el nombre de la tabla y las condiciones de la consulta
                string condiciones = " where id_categoria='" + idCategoriaSeleccionada + "'";
                resultadoConsultaSelect = operaciones.SqlSelect("*", nombreTabla, condiciones);         //ejecutamos la consulta
                if (resultadoConsultaSelect.Rows.Count > 0)         //si obtenemos resultado extraemos la informacion y la almacenamos en los textbox
                {
                    renglon = resultadoConsultaSelect.Rows[0];
                    txtIdCategoríaM.Text = renglon["id_categoria"].ToString();
                    txtNombreCategoríaM.Text = renglon["nombre"].ToString();
                    pnlModificarCategoríaM.Visible = true;
                    pnlCategorias.Visible = false;
                }
                else
                {
                    Operaciones.MessageBoxx("No se encontro la categoria buscada", "Categoria Inexistente");            //mensaje que indica que la categoria no existe
                }

            }
            else
            {
                Operaciones.MessageBoxx("seleccione una categoria de la tabla", "categoria invalida");      //mensaje que indica que primero debemos seleccionar una categoria
            }
        }

        //modificar el nombre de una categoria seleccionada
        private void btnModificarCategoríaM_Click(object sender, EventArgs e)
        {
            if (!txtNombreCategoríaM.Text.Equals(""))
            {       //validamos que el cuadro de texto del nombre de categoria no este vacio 
                string consulta = "update categorias set nombre='"
                                    + txtNombreCategoríaM.Text
                                    + "' where id_categoria='" + txtIdCategoríaM.Text + "'";        //creamos la consulta que mandaremos a la base de datos
                operaciones.Sql(consulta);      //mandamos llamar el metodoo que nos insertara los datos en la DB
                Operaciones.MessageBoxx("Categoria Modificada Satisfactoriamente", "Modifica Categoria");           //mostramos el msgbox indicando que se agrego la categoria
                txtNombreCategoríaM.Text = null;                                    //limpiamos el campo
                pnlModificarCategoríaM.Visible = false;
                pnlCategorias.Visible = true;
                idCategoriaSeleccionada = 0;
                ActualizarCategorias();                                                //actualizamos las categorias
            }
            else
            {
                Operaciones.MessageBoxx("No se pudo agregar categoria, Especifique un nombre", "No se agrego Categoria");        //mostramos el msgbox indicando que no fue posible agregar la caegoria ya que no se especifico un nombre
            }
        }

        //agregar cliente al sistema
        private void btnAgregarClienteA_Click(object sender, EventArgs e)
        {
            if (!txtNombreClienteA.Text.Equals("")              //validacion de campos vacios
                && !txtApellidoClienteA.Text.Equals("")
                && !txtTelefonoClienteA.Text.Equals("")
                && !txtDireccionClienteA.Text.Equals("")
                && !txtEmailClienteA.Text.Equals("")
                && !txtCiudadClienteA.Text.Equals("")
                && !txtDireccionEntregaClienteA.Text.Equals("")
                && !txtCpClienteA.Text.Equals("")
                && !txtUsuarioClienteA.Text.Equals("")
                && !txtContraseñaClienteA.Text.Equals(""))
            {
                if (txtContraseñaClienteA.Text.Equals(txtContraseñaCliente2A.Text))         //validacion de contraseñas iguales
                {
                    String nombreTabla = "clientes";       //declaramos un string con el nombre de la tabla a la que haremos la consulta
                    String consulta = "insert into " + nombreTabla
                                      + "(nombre, apellidos, telefono, direccion, ciudad, email, direccion_entrega, cp, usuario, password) values('"
                                      + txtNombreClienteA.Text + "','"
                                      + txtApellidoClienteA.Text + "','"
                                      + txtTelefonoClienteA.Text + "','"
                                      + txtDireccionClienteA.Text + "','"
                                      + txtCiudadClienteA.Text + "','"
                                      + txtEmailClienteA.Text + "','"
                                      + txtDireccionEntregaClienteA.Text + "','"
                                      + txtCpClienteA.Text + "','"
                                      + txtUsuarioClienteA.Text + "','"
                                      + txtContraseñaClienteA.Text + "')";      //creamos la cadena que mandaremos a al metodo para insertar en la base datos
                    if (operaciones.Sql(consulta))
                    {             //si el resultado es true
                        String condicionesConsulta = " order by id_cliente desc";    //creamos la consulta para las condiciones de una consulta select
                        resultadoConsultaSelect = operaciones.SqlSelect("id_cliente", nombreTabla, condicionesConsulta);                 //mandamos los parametros para que nos regrese una tabla con el resultado de la consulta
                        renglon = resultadoConsultaSelect.Rows[0];                                  //obtenemos el ultimo renglon de la tabla de resultado
                        Operaciones.MessageBoxx("Cliente Agregado correctamente, Id: " + renglon["id_cliente"], "Cliente Agregado");                              //mostramos el id del producto insertado
                        txtNombreClienteA.Text = null;              //reseteamos los campos
                        txtApellidoClienteA.Text = null;
                        txtTelefonoClienteA.Text = null;
                        txtDireccionClienteA.Text = null;
                        txtCiudadClienteA.Text = null;
                        txtEmailClienteA.Text = null;
                        txtDireccionEntregaClienteA.Text = null;
                        txtCpClienteA.Text = null;
                        txtUsuarioClienteA.Text = null;
                        txtContraseñaClienteA.Text = null;
                        txtContraseñaCliente2A.Text = null;
                        dgridClientes.DataSource = operaciones.SqlSelect("id_cliente, nombre, apellidos,telefono, direccion, ciudad, email, direccion_entrega, cp, usuario", "clientes", "");       //actualizamos el datagrid de clientes
                    }
                    else
                    {       //si no se pudo insertar el producto mostramos un mssgox indicandolo
                        Operaciones.MessageBoxx("no se pudo Agregar el cliente", "Cliente No Agregado");        //mensaje que indica que no se pudo agregar el cliente
                    }
                }
                else
                {
                    Operaciones.MessageBoxx("Error##... Las contraseñas no coinciden", "Error De Contraseñas");         //mensaje que indica error de contraseñas
                }
            }
            else
            {
                Operaciones.MessageBoxx("Error##... Rellene todos los datos del usuario para continuar", "Campos vacios");      //mensaje que indica que existen campos vacios
            }
        }

        //eliminar un cliente del sistema
        private void btnEliminarClienteE_Click(object sender, EventArgs e)
        {
            if (idClienteSeleccionado > 0)          //si tenemos un cliente seleccionado
            {
                String respuesta = Operaciones.MessageBoxx("Si desea eliminar el Cliente seleccionado"          //pedimos confirmacion de eliminacion
                                                           + Environment.NewLine + "Id:"
                                                           + idClienteSeleccionado + " Pulse Aceptar", "verifique la informacion");
                if (respuesta == "Yes")         //si la respuesta es yes
                {
                    String consulta = "delete from clientes where id_cliente='" + idClienteSeleccionado + "'";      // se crea la consulta y se ejecuta
                    if (operaciones.Sql(consulta))
                    {
                        Operaciones.MessageBoxx("Cliente Eliminado ", "confirmacion");      //se muestra el mensaje que indica que se elimino cliente y se actualiza el datagrid
                        dgridClientes.DataSource = operaciones.SqlSelect("id_cliente, nombre, apellidos,telefono, direccion, ciudad, email, direccion_entrega, cp, usuario", "clientes", "");
                    }
                    else
                    {
                        Operaciones.MessageBoxx("no se pudo eliminar el cliente", "confirmacion");          //mensaje que indica que no se pudo eliminar el cliente
                    }
                }
            }
            else
            {
                Operaciones.MessageBoxx("Primero debe seleccionar un cliente de la tabla", "Seleccione Cliente");           //mensaje que indica que aun no se ah seleccionado ningun cliente
            }
        }

        //seleccionamos el cliente al que modificaremos su informacion
        private void btnSeleccionarClienteM_Click(object sender, EventArgs e)
        {

            if (idClienteSeleccionado > 0)      //valida si tenemos cliente seleccionado
            {
                string nombreTabla = "clientes";            //se declara el nombre de tabla y las condiciones de la consulta
                string condiciones = " where id_cliente='" + idClienteSeleccionado + "'";
                resultadoConsultaSelect = operaciones.SqlSelect("*", nombreTabla, condiciones);     //se ejecuta la consulta
                if (resultadoConsultaSelect.Rows.Count > 0)
                {
                    renglon = resultadoConsultaSelect.Rows[0];          //se extrae la informacion obtenida de la consulta y se almacena en los campos
                    txtApellidoClienteM.Text = renglon["apellidos"].ToString();
                    txtCiudadClienteM.Text = renglon["ciudad"].ToString();
                    txtContraseñaClienteM.Text = renglon["password"].ToString();
                    txtCpClienteM.Text = renglon["cp"].ToString();
                    txtDireccionClienteM.Text = renglon["direccion"].ToString();
                    txtDireccionEntregaClienteM.Text = renglon["direccion_entrega"].ToString();
                    txtEmailClienteM.Text = renglon["email"].ToString();
                    txtIdClienteM.Text = renglon["id_cliente"].ToString();
                    txtNombreClienteM.Text = renglon["nombre"].ToString();
                    txtTelefonoClienteM.Text = renglon["telefono"].ToString();
                    txtUsuarioClienteM.Text = renglon["usuario"].ToString();
                    txtRepiteContraseñaClienteM.Text = renglon["password"].ToString();
                    pnlClienteM.Visible = true;
                    pnlClientes.Visible = false;
                    btnSeleccionarClienteM.Visible = false;
                    btnEliminarClienteE.Visible = false;
                }
                else
                {
                    Operaciones.MessageBoxx("No se encontroel cliente buscado", "Cliente No Registrado");           //mensaje que indica que no se encontro el cliente buscado
                }

            }
            else
            {
                Operaciones.MessageBoxx("Primero debe seleccionar un cliente de la tabla", "Cliente invalido");         //mensaje que indica que primero debe seleccionar un cliente
            }

        }
        
        // metodo para modificar la informacion de un cliente 
        private void btnModificarClienteM_Click(object sender, EventArgs e)
        {
            if (!txtNombreClienteM.Text.Equals("")              //validacion de campos vacios
                           && !txtApellidoClienteM.Text.Equals("")
                           && !txtTelefonoClienteM.Text.Equals("")
                           && !txtDireccionClienteM.Text.Equals("")
                           && !txtEmailClienteM.Text.Equals("")
                           && !txtCiudadClienteM.Text.Equals("")
                           && !txtDireccionEntregaClienteM.Text.Equals("")
                           && !txtCpClienteM.Text.Equals("")
                           && !txtUsuarioClienteM.Text.Equals("")
                           && !txtContraseñaClienteM.Text.Equals(""))
            {
                if (txtContraseñaClienteM.Text.Equals(txtRepiteContraseñaClienteM.Text))            //validacion de contraseñas iguales
                {
                    String nombreTabla = "clientes";       //declaramos un string con el nombre de la tabla a la que haremos la consulta
                    String consulta = "update " + nombreTabla       //declaramos la consulta
                                      + " set nombre = '" + txtNombreClienteM.Text
                                      + "', apellidos ='" + txtApellidoClienteM.Text
                                      + "', telefono= '" + txtTelefonoClienteM.Text
                                      + "', direccion='" + txtDireccionClienteM.Text
                                      + "', ciudad='" + txtCiudadClienteM.Text
                                      + "', email='" + txtEmailClienteM.Text
                                      + "', direccion_entrega='" + txtDireccionEntregaClienteM.Text
                                      + "', cp='" + txtCpClienteM.Text
                                      + "', usuario='" + txtUsuarioClienteM.Text
                                      + "', password='" + txtContraseñaClienteM.Text
                                      + "' where id_cliente='" + txtIdClienteM.Text + "'";       //creamos la cadena que mandaremos a al metodo para modificar en la base datos
                    if (operaciones.Sql(consulta))
                    {             //si el resultado es true
                        String condicionesConsulta = " where id_cliente='" + txtIdClienteM.Text + "'";    //creamos la consulta para las condiciones de una consulta select
                        resultadoConsultaSelect = operaciones.SqlSelect("id_cliente", nombreTabla, condicionesConsulta);                 //mandamos los parametros para que nos regrese una tabla con el resultado de la consulta
                        renglon = resultadoConsultaSelect.Rows[0];                                  //obtenemos el ultimo renglon de la tabla de resultado
                        Operaciones.MessageBoxx("Cliente Modificado correctamente, Id: " + renglon["id_cliente"], "Modifica Cliente");                              //mostramos el id del cliente modificado
                        pnlClienteM.Visible = false;            //ocultamso controles y mostramso otros y actualizamos el datagrid de los clientes
                        pnlClientes.Visible = true;
                        btnSeleccionarClienteM.Visible = true;
                        btnEliminarClienteE.Visible = true;
                        dgridClientes.DataSource = operaciones.SqlSelect("id_cliente, nombre, apellidos,telefono, direccion, ciudad, email, direccion_entrega, cp, usuario", "clientes", "");
                    }
                    else
                    {       //si no se pudo modificar el cliente mostramos un mssgox indicandolo
                        Operaciones.MessageBoxx("no se pudo Modificar el cliente", "Modifica Cliente");
                    }
                }
                else
                {
                    Operaciones.MessageBoxx("Error##... Las contraseñas no coinciden", "Error De Contraseñas");         //contraseñas no coinciden
                }
            }
            else
            {
                Operaciones.MessageBoxx("Error##... Rellene todos los datos del usuario para continuar", "Campos vacios");          //campos vacios
            }
        }

        //metodo que nos abrira la ventana de cortes
        private void btnCorte_Click(object sender, EventArgs e)
        {
            Corte corte = new Corte();      //se crea un objeto de corte
            corte.Show();               //se muestra la ventana de corte y se cierra la actual
            Dispose();
        }

        //metodo que nos abrira la ventana para la entrada manual de efectivo
        public void EntradaEfectivo()
        {
            Registro_de_Entrada_de_Efectivo registro = new Registro_de_Entrada_de_Efectivo();       //declaramso objeto de la entrada de efectivo
            registro.Show();                //mostramos la ventana de entrada de efectivo
            Dispose();  //ocultamos el formulario
        }

        //metodo que se activa al dar click sobre una celda del datagrid de productos
        private void dgridProductos_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)      //si se da click izquierdo
            {
                if (dgridProductos.RowCount > 0)        //si el datagrid tiene renglones
                {
                    DataGridView.HitTestInfo hit = dgridProductos.HitTest(e.X, e.Y);
                    if (hit.Type == DataGridViewHitTestType.Cell)       //si dimos click sobre una celda
                    {
                        idProductoSeleccionado = Convert.ToInt16(dgridProductos[0, hit.RowIndex].Value);        // se obtiene el valor del id que se encuentra en la columna 0 y el renglon seleccionado

                    }
                }
            }

        }

        //metodo que muestra el inputbox en pantalla recibe la descripcion y el titulo
        public string InputBox(String descripcion, String titulo)
        {
            inputbox inputBox = new inputbox();     //declaramos el objeto
            inputBox.Text = titulo;                 //asignamos el titulo
            inputBox.lblInformacion.Text = descripcion;     //assignamos la descripcion
            DialogResult resul = new DialogResult();        //declaramos el resultado
            resul = inputBox.ShowDialog();      //mostramos y obtenemos el resultado
            if (resul == DialogResult.OK)       //si se presiona ok
            {
                return inputBox.txtValor.Text;      //regresamos el valor del cuadro de texto
            }
            else
            {
                return "";      //si no se regresa un valor vacio
            }
        }

        //metodo que se activa al dar click en el datagrid de empleados
        private void dgridEmpleados_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)  //si se da click izquierdo
            {
                if (dgridEmpleados.RowCount > 0)  //si el datagrid tiene renglones
                {
                    DataGridView.HitTestInfo hit = dgridEmpleados.HitTest(e.X, e.Y);
                    if (hit.Type == DataGridViewHitTestType.Cell)       //si se dio click sobre una celda
                    {
                        idEmpleadoSeleccionado = Convert.ToInt16(dgridEmpleados[0, hit.RowIndex].Value);        //se toma el valor de la columna 0 y el renglon seleccionado

                    }
                }
            }
        }

        //metodo que se activa al hacer cick sobre el datagrid clientes
        private void dgridClientes_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)          //si se da click izquierdo
            {
                if (dgridClientes.RowCount > 0)         //si el datagrid tiene renglones
                {
                    DataGridView.HitTestInfo hit = dgridClientes.HitTest(e.X, e.Y);
                    if (hit.Type == DataGridViewHitTestType.Cell)       //si se da click en una celda
                    {
                        idClienteSeleccionado = Convert.ToInt16(dgridClientes[0, hit.RowIndex].Value);       //se toma el valor de la columna 0 y el renglon seleccionado

                    }
                }
            }
        }

        //metodo que se activa si se da click en el datagrid categorias
        private void dgridCategorias_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)          //si se da click izquierdo
            {
                if (dgridCategorias.RowCount > 0)       //si el datagrid tiene renglones
                {
                    DataGridView.HitTestInfo hit = dgridCategorias.HitTest(e.X, e.Y);
                    if (hit.Type == DataGridViewHitTestType.Cell)           //si se da click en una celda
                    {
                        idCategoriaSeleccionada = Convert.ToInt16(dgridCategorias[0, hit.RowIndex].Value);           //se toma el valor de la columna 0 y el renglon seleccionado

                    }
                }
            }
        }

        //metodo que se activa al hacer click sobre el datagris pedidos
        private void dgridPedidos_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)          //si se da click izquierdo
            {
                if (dgridPedidos.RowCount > 0)      //si el datagrid contiene renglones
                {
                    DataGridView.HitTestInfo hit = dgridPedidos.HitTest(e.X, e.Y);
                    if (hit.Type == DataGridViewHitTestType.Cell)           //si se selecciono una celda
                    {
                        idPedidoSeleccionado = Convert.ToInt16(dgridPedidos[0, hit.RowIndex].Value);             //se toma el valor de la columna 0 y el renglon seleccionado

                    }
                }
            }
        }

        //metodo utilizado para mostrar el detalle de un pedido web
        private void btnDetallePedido_Click(object sender, EventArgs e)
        {
            if (idPedidoSeleccionado > 0)       //si tenemos pedido seleccionado
            {
                lblDetallePedido.Text = "Detalle Pedido id: " + idPedidoSeleccionado;       //se le da el valor a la etiqueta añadiendole el id del pedido
                dgridDetallePedido.DataSource = operaciones.SqlSelect("productos.Nombre, productos.precio, detalle_pedido.cantidad, productos.precio * detalle_pedido.cantidad AS SubTotal", "detalle_pedido", "INNER JOIN productos ON detalle_pedido.id_producto = productos.id_producto WHERE (detalle_pedido.id_pedido ='" + idPedidoSeleccionado + "')");      //se hace la consulta y se almacena en una tabla

                for (int i = 0; i < dgridDetallePedido.RowCount; i++)       // se recorre el datagrid
                {
                    totalPedido += Convert.ToDouble(dgridDetallePedido[3, i].Value);            //se calcula el total
                }
                lblTotalPedido.Text = String.Format("{0:C}",totalPedido);           //se muestra el total en una etiqueta
                pnlPedidos.Visible = false;             //se ocultan o muestran campos
                pnlDetallePedido.Visible = true;
            }
            else
            {
                Operaciones.MessageBoxx("primero seleccione el pedido", "seleccione pedido");           //indicamos que primero debe seleccionar un pedido
            }
        }

        //metodo que regresa a mostrar los pedidos
        private void btnVolverPedidos_Click(object sender, EventArgs e)
        {
            pnlDetallePedido.Visible = false;       //ocultamos un panel y mostramso otro y reseteamos el pedido seleccionado
            pnlPedidos.Visible = true;
            idPedidoSeleccionado = 0;
        }

        //metodo que elimina un pedido 
        private void btnEliminarPedido_Click(object sender, EventArgs e)
        {
            string consulta = "delete from pedidos where id_pedido='" + idPedidoSeleccionado + "'";     //generamso la consulta y la ejecutamos
            operaciones.Sql(consulta);
            dgridPedidos.DataSource = operaciones.SqlSelect("pedidos.id_pedido, pedidos.fecha_pedido, clientes.nombre", " pedidos ", "INNER JOIN clientes ON pedidos.id_cliente = clientes.id_cliente WHERE (pedidos.estado = 0)");     //actualizamos la tabla de pedidos
            idPedidoSeleccionado = 0;           //reseteamos el id y ocultamos un panel y mostrasmo el otro
            pnlDetallePedido.Visible = false;
            pnlPedidos.Visible = true;
        }

        //metodo que muestra la pantalla de los reportes y cierra la actual
        private void btnReportes_Click(object sender, EventArgs e)
        {
          //  Reportes reporte = new Reportes();      //declaramos el objeto de reportes
          //  reporte.Show();         //mostramos la pantalla de reporte y cerramos la anterior
         //   Dispose();
        }

        private void btnValidaWeb_Click(object sender, EventArgs e)
        {
            string consulta = "update pedidos set estado = 1 where id_pedido='"+ idPedidoSeleccionado+"'";
            operaciones.Sql(consulta);
            Operaciones.MessageBoxx("Pedido Validado, Imprimiendo Ticket", "validacioon de Pedido");
            ImprimeTicket(0, 2);
            ImprimeTicket(0, 2);
            dgridPedidos.DataSource = operaciones.SqlSelect("pedidos.id_pedido, pedidos.fecha_pedido, clientes.nombre", " pedidos ", "INNER JOIN clientes ON pedidos.id_cliente = clientes.id_cliente WHERE (pedidos.estado = 0)");     //actualizamos la tabla de pedidos
            idPedidoSeleccionado = 0;           //reseteamos el id y ocultamos un panel y mostrasmo el otro
            pnlDetallePedido.Visible = false;
            pnlPedidos.Visible = true;
        }

       
    }
}

